import org.junit.Test;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * Java提供的网络类库，可以实现无痛网络连接，联网的底层细节被隐藏在Java的本机安装系统里，
 * 由JVM进行控制。
 * 并且Java实现了一个跨平台的网络库，程序员面对的是一个统一的网络编程环境。
 * <p>
 * 实现网络传输 三要素
 * -IP地址：准确定位网络上一台或多台主机  IPv4 4字节； IPv6 16 字节
 * -端口号：定位主机上特定应用（0 - 65535）
 * ---公认端口：0-1023 被预先定义的服务通信占用。
 * ---注册端口：2024-49151 分配给用户进或应用进程。 Tomcat 8080  MySQL 3306 Oracle 1521
 * ---动态、私有端口：49152-65535
 * -规范网络通信协议：可靠、高效地进行数据传输 OSI参考模型 + TCP/IP参考模型
 * <p>
 * InetAddress类
 * -InetAddress类的一个实例就代表一个IP地址
 * <p>
 * TCP  UDP
 * TCP:
 * -TCP协议进行通信的两个应用程序：客户端、服务端
 * -使用TCP协议前，需要先建立TCP连接，形成基于字节流的传输数据通道
 * -传输前，采用“三次握手”方式，点对点通信，是可靠的
 * --TCP协议使用重发机制，
 * --当一个通信实体发送一个信息给另一个通信实体后，需要收到另一个通信实体确认信息，
 * --如果没有收到另一个通信实体确认信息，则会重复刚才发送的信息。
 * -在连接中可进行大数据量的传输
 * -传输完毕，须释放已建立的连接，效率低。
 * UDP:
 * -UDP协议今昔那个通信的两个应用程序：发送端、接收端。
 * -将数据、源、目的封装成数据包（传输的基本单位），不需要建立连接
 * -发送不管对方是否确认好，接收方收到也不确认，不能保证数据的完整性，故是不可靠的
 * -每个数据报的大小限制在64K内
 * -发送数据结束时，无需释放资源，开销小，通信效率高。
 * -适用场景：音视频和普通数据的传输。
 * <p>
 * Socket类
 * 网络上具有唯一标识的IP地址和端口号组合在一起构成唯一能识别的标识符套接字(Socket)
 * 利用套接字(Socket)开发网络应用程序早已被广泛采用，以至于成为事实上的标准。
 * 网络通信其实就是Socket间通信。
 * 通信的两端都要有Socket，是两台机器间通信的端点。
 * Socket允许程序把网络连接当成一个流，数据在两个Socket间通过IO传输。
 * 一般主动发起通信的应用程序属客户端，等待通信请求的为服务端。
 * Socket分类：
 * -流套接字(stream socket): 使用TCP提供可依赖的字节流服务
 * ---ServerSocket:此类实现TCP服务器套接字。服务器套接字等待请求通过网络传入。
 * ---Socket：此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
 * -数据报套接字(datagram socket)：使用UDP提供“尽力而为”的数据报服务。
 * ---DatagramSocket：此类表示用来发送和接收UDP数据报包的套接字。
 */
public class NetworkTest {
    @Test
    public void testInetAddress() {
        try {
            // 1. 实例化
            // 获取指定IP对应的InetAddress的实例
            InetAddress byName = InetAddress.getByName("127.0.0.1");
            System.out.println(byName.getHostName());
            System.out.println(byName.getHostAddress());

            InetAddress byName1 = InetAddress.getByName("www.baidu.com");
            System.out.println(byName1.getHostName()); // www.baidu.com

            System.out.println(byName1.getHostAddress()); // 110.242.69.21

            System.out.println(byName); // /127.0.0.1
            System.out.println(byName1); // www.baidu.com/110.242.70.57
            // 获取本地IP对应的InetAddress的实例
            System.out.println(InetAddress.getLocalHost()); // DESKTOP-88GMTT4/192.168.197.1

        } catch (UnknownHostException e) {
            throw new RuntimeException(e);
        }
    }
}
